/**
 * @defgroup TestStream 关于Java输入输出流的例子
 * @author 李焕帅
 * @version 0.1
 * @date 30/07/2012
 * @{
 */
/**
 * @name 包定义
 * @{
 */
package indd.lihs.basic.javabasictester.io;

import java.io.*;
import java.util.*;
import indd.lihs.basic.exceptions.*;

/** @}*/
// 包定义

/**
 * @name 测试类型定义 使用File类进行文件和目录管理
 * @{
 */
public class TestStream
{
    /**
     * 主函数
     * @param[in] args 参数字符串数组
     * @return void
     * @note 某个方法可能抛出某种异常,但其中没有定义相应的捕获代码.这时如果抛出,\n 则系统直接退出该方法,并将异常发回给调用者其中
     * @note 默认情况下, 相对路径会被解释为相对当前工作路径
     */
    public static void main(String[] args)
    {
        /** 输入流 */
        Scanner cin = new Scanner(System.in);

        try
        {
            // 创建文件
            System.out.print("即将创建一个目录,请输入目录名: ");
            String dirName = cin.nextLine();
            File dir = new File(dirName);
            if (dir.exists()) // 文件已存在则失败
                throw new FileExistedException(dir.getName()); // 非必检异常
            dir.mkdir(); // 创建文件夹

            // 重命名文件
            System.out.print("即将给一个文件或目录重命名, 它是: ");
            String fileName = cin.nextLine();
            File oldFile = new File(fileName);
            if (!oldFile.exists()) // 文件不存在则失败
                throw new FileNotExistedException(oldFile.getName());
            System.out.print("请输入新名称: ");
            fileName = cin.nextLine();
            File newFile = new File(fileName);
            if (newFile.exists()) // 文件存在则失败
                throw new FileExistedException(newFile.getName());
            oldFile.renameTo(newFile);

            // 删除文件
            System.out.print("即将删除一个文件或目录, 它是: ");
            fileName = cin.nextLine();
            File file = new File(fileName);
            if (!file.exists()) // 文件不存在则失败
                throw new FileNotExistedException(file.getName());
            System.out.print("确定删除吗? Y/N: ");
            if (cin.nextLine().trim().equalsIgnoreCase("Y")) // 判断输入为Y或y
                file.delete();
            else
                // 判断输入不为Y或y
                System.out.println("未执行删除");

            // 查看目录的文件及子目录
            System.out.print("查看目录中所含的文件及子目录, 目录名: ");
            dirName = cin.nextLine();
            dir = new File(dirName);
            if (!dir.isDirectory()) // 不为文件夹则失败
                throw new FileTypeMismatchException(dir.getName(), "directory",
                                "file");
            String[] list = dir.list();
            for (int i = 0; i < list.length; i++)
            {
                System.out.println(list[i]);
            }

            // 查看文件属性
            System.out.print("查看一个文件属性, 请输入文件名: ");
            fileName = cin.nextLine();
            file = new File(fileName);
            if (!file.isFile()) // 为文件夹则失败
                throw new FileTypeMismatchException(file.getName(), "file",
                                "directory");
            System.out.println("name: " + file.getName() + "\nparent: "
                            + file.getParent() + "\nlength(byte): "
                            + file.length() + "\ncan_read_or_not: "
                            + file.canRead() + "\ncan_write_or_not: "
                            + file.canWrite());
        }
        /**
         * @belief 文件已存在异常
         * @see indd.lihs.basic.exceptions.FileExistedException
         */
        catch (FileExistedException ex)
        {
            System.out.println("文件或目录已存在!\n");
            ex.printStackTrace();
        }
        /**
         * @belief 文件不存在异常
         * @see indd.lihs.basic.exceptions.FileNotExistedException
         */
        catch (FileNotExistedException ex)
        {
            System.out.println(ex);
            ex.printStackTrace();
        }
        /**
         * @belief 文件类型失配异常
         * @see indd.lihs.basic.exceptions.FileTypeMismatchException
         */
        catch (FileTypeMismatchException ex)
        {
            System.out.println("文件或目录无法匹配!\n");
            ex.printStackTrace();
        }
        finally
        { // 共用操作
            cin.close(); // 关闭输入流
        }
    }
}

/** @}*/
// 测试类型定义

/** @}*/
// 模块定义
